package cn.biplam.common.wrapper.treeFlat.pcTree;

import java.util.ArrayList;
import java.util.List;

import cn.biplam.common.struc.BaseStruc.IndexTableStruc;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;
import cn.biplam.common.wrapper.treeFlat.PcNode;
import cn.biplam.common.wrapper.treeFlat.pcTree.callback.OperatorTypeCallbackImp;

/**
 *  索引表父子关系转树形关系<BR>
 *  适用场景:将获取当前系统中索引表的树形结构
 * @author XiaoRuxing Nov 21, 200910:25:04 AM
 * @version 1.0
 */
public class IndexPcTree implements PcTree{

	private TablePcTree tree;
	
	/**
	 *  构造方法
	 * @param tableName 表名称
	 */
	public IndexPcTree(String tableName) throws ErrorMessage{
		tree = new TablePcTree(tableName);
		//设置字段映射关系
		tree.setFieldMap(IndexTableStruc.NODE_ID, 
				IndexTableStruc.NODE_PARENT, 
				IndexTableStruc.NODE_NAME,
				null);
		tree.putAddFields(IndexTableStruc.OPERATOR_TYPE);
		//当前树操作类型
		tree.setOperatorCallback(new OperatorTypeCallbackImp(IndexTableStruc.OPERATOR_TYPE));
		//设置排序方式
		tree.setOrderFields(IndexTableStruc.NODE_PARENT,IndexTableStruc.NODE_SEQUENCE);
	}
	
	/**
	 * 设置过滤数据列表 
	 * @param filterList 被过滤的节点列表(存储的内容为节点ID)
	 */
	public void setDataFilter(List<String> filterList){
		this.tree.setDataFilter(filterList);
	}

	/**
	 *  设置包含节点列表<BR>
	 *  列表中节点的所有子节点作为当前树的数据,即根节点为列表中的节点(节点数不应过多)<BR>
	 *  与节点过滤条件同时设置时,只能过滤当前节点列表的子节点<BR>
	 * @param includeList 被包含节点的列表
	 */
	public void setInclude(List<String> includeList){
		this.tree.setInclude(includeList);
	}

	/**
	 *  设置包含节点,用于只获取指定节点的子树时<BR>
	 *  列表中节点的所有子节点作为当前树的数据,即根节点为列表中的节点(节点数不应过多)<BR>
	 *  与节点过滤条件同时设置时,只能过滤当前节点列表的子节点<BR>
	 * @param includeList 被包含节点
	 */
	public void setInclude(String includeNode){
		if(includeNode!=null){
			List<String> includeList = new ArrayList<String>();
			includeList.add(includeNode);
			this.setInclude(includeList);
		}
	}

	/**
	 *  设置包含节点列表,<BR>
	 *  列表中节点的所有子节点作为当前树的数据,即根节点为列表中的节点(节点数不应过多)<BR>
	 *  与节点过滤条件同时设置时,只能过滤当前节点列表的子节点<BR>
	 * @param includeList 被包含节点列表,列表为一个数组
	 */
	public void setInclude(String... includeNode){
		List<String> include = new ArrayList<String>();
		for(String node:includeNode){
			include.add(node);
		}
		this.setInclude(include);
	}

	/**
	 * @return 获取当前树
	 * @throws ErrorMessage
	 */
	public PcNode get() throws ErrorMessage {
		//设置数据
		return this.tree.get();
	}

	public KvMap<String, String> getFieldMap() {
		// TODO Auto-generated method stub
		return null;
	}
}
